/*
 * buffer.c
 *
 *  Created on: 25/10/2010
 *      Author: wendell
 */

#include <io.h>
#include <keyboard.h>


//uchar buffer[BUFFSIZE];
//int first, last, nitens;

// Insere um dado no buffer
void bufferInsert(Buffer *b, uchar data) {
	if(b->last == BUFFSIZE-1) { //circule
		b->last = -1;
	}
	b->buffer[++b->last] = data;
	b->nitens++;
}

// Tira (e retorna o primeiro elemento do buffer)
uchar bufferPop(Buffer *b) {
	uchar head = b->buffer[b->first++];  //pega o valor e incermenta a frente
	if(b->first==BUFFSIZE) { //circule
		b->first = 0;
	}
	b->nitens--;
	return head;
}

// Mostra o primeiro do buffer (sem remove-lo)
uchar firstBuffer(Buffer *b) {
	return b->buffer[b->first];
}

// Verifica se o buffer estah vazio
bool bufferIsEmpty(Buffer *b) {
	return (b->nitens==0);
}

// Verifica se o buffer estah cheio
bool bufferIsFull(Buffer *b) {
	return (b->nitens==BUFFSIZE);
}

//Retorna o tamanho do buffer (qtde de dados)
inline int size(Buffer *b) {
	return b->nitens;
}


// Flush - Limpa o buffer
inline void flush(Buffer *b) {
	initBuffer(b);
}

// Inicializa o buffer
void initBuffer(Buffer *b) {
	b->first = 0;
	b->last = -1;
	b->nitens = 0;
	int i;
	for(i=0; i<BUFFSIZE; ++i)
		b->buffer[i] = '\0';
}
